package com.ruoyi.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.WebDeptProduct;
import com.ruoyi.system.domain.WebDeptProductCargo;
import com.ruoyi.system.domain.WebDeptProductCargoReply;
import com.ruoyi.system.domain.WebDeptProductLog;
import com.ruoyi.system.mapper.WebDeptProductCargoReplyMapper;
import com.ruoyi.system.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;

/**
 * 调货处理Service业务层处理
 * 
 * @author wsliupan@126.com
 * @date 2021-06-27
 */
@Service
public class WebDeptProductCargoReplyServiceImpl extends ServiceImpl<WebDeptProductCargoReplyMapper, WebDeptProductCargoReply> implements IWebDeptProductCargoReplyService
{
    @Autowired
    private WebDeptProductCargoReplyMapper webDeptProductCargoReplyMapper;

    /**
     * 查询调货处理
     * 
     * @param id 调货处理ID
     * @return 调货处理
     */
    @Override
    public WebDeptProductCargoReply selectWebDeptProductCargoReplyById(Long id)
    {
        return webDeptProductCargoReplyMapper.selectWebDeptProductCargoReplyById(id);
    }

    /**
     * 查询调货处理列表
     * 
     * @param webDeptProductCargoReply 调货处理
     * @return 调货处理
     */
    @Override
    @DataScope(deptAlias = "t1")
    public List<WebDeptProductCargoReply> selectWebDeptProductCargoReplyList(WebDeptProductCargoReply webDeptProductCargoReply)
    {
        return webDeptProductCargoReplyMapper.selectWebDeptProductCargoReplyList(webDeptProductCargoReply);
    }

    /**
     * 新增调货处理
     * 
     * @param webDeptProductCargoReply 调货处理
     * @return 结果
     */
    @Override
    public int insertWebDeptProductCargoReply(WebDeptProductCargoReply webDeptProductCargoReply)
    {
        webDeptProductCargoReply.setCreateTime(DateUtils.getNowDate());
        return webDeptProductCargoReplyMapper.insertWebDeptProductCargoReply(webDeptProductCargoReply);
    }

    /**
     * 修改调货处理
     * 
     * @param webDeptProductCargoReply 调货处理
     * @return 结果
     */
    @Override
    public boolean updateWebDeptProductCargoReply(WebDeptProductCargoReply webDeptProductCargoReply)
    {
        //webDeptProductCargoReply.setUpdateTime(DateUtils.getNowDate());
        //return webDeptProductCargoReplyMapper.updateWebDeptProductCargoReply(webDeptProductCargoReply);
        return this.saveOrUpdate(webDeptProductCargoReply);
    }

    /**
     * 删除调货处理对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public boolean deleteWebDeptProductCargoReplyByIds(String ids)
    {
        //return webDeptProductCargoReplyMapper.deleteWebDeptProductCargoReplyByIds(Convert.toStrArray(ids));
        return this.removeByIds(Arrays.asList(Convert.toStrArray(ids)));
    }

    /**
     * 删除调货处理信息
     * 
     * @param id 调货处理ID
     * @return 结果
     */
    @Override
    public boolean deleteWebDeptProductCargoReplyById(Long id)
    {
        //return webDeptProductCargoReplyMapper.deleteWebDeptProductCargoReplyById(id);
        return this.removeById(id);
    }

    @Transactional
    public int saveReplyData(WebDeptProductCargoReply webDeptProductCargoReply){
        WebDeptProductCargoReply cargoReplyData = getById(webDeptProductCargoReply.getId());

        webDeptProductCargoReply.setStatus("1"); //同意
        updateWebDeptProductCargoReply(webDeptProductCargoReply);
        iWebDeptProductCargoService.update(new UpdateWrapper<WebDeptProductCargo>()
                .eq("id",cargoReplyData.getCargoId())
                .set("status",2)
        );
        //减库存
        WebDeptProduct product = iWebDeptProductService.getById(webDeptProductCargoReply.getSelectProductId());
        if(product == null){
           throw new BusinessException("减库存商品不存在");
        }
        if(product.getDeptId().longValue() != cargoReplyData.getTargetSource().longValue()){
            throw new BusinessException("所选商品没在当前门店中");
        }
        long stock = product.getStock() - cargoReplyData.getNumber();
        if(stock < 0){
            throw new BusinessException("扣减库存不足");
        }
        iWebDeptProductService.update(new UpdateWrapper<WebDeptProduct>()
                .eq("id",webDeptProductCargoReply.getSelectProductId())
                .set("stock",product.getStock() - cargoReplyData.getNumber())
        );
        SysDept sysDept = iSysDeptService.selectDeptById(product.getDeptId());
        //出库记录
        WebDeptProductLog productLog = new WebDeptProductLog();
        productLog.setDeptId(product.getDeptId());
        productLog.setDeptName(sysDept.getDeptName());
        productLog.setProductId(product.getId());
        productLog.setProductName(product.getName());
        productLog.setNumber(cargoReplyData.getNumber()+"");
        productLog.setComment("调货出库");
        iWebDeptProductLogService.save(productLog);

        //加库存
        product = iWebDeptProductService.getById(cargoReplyData.getProductId());
        if(product == null){
            throw new BusinessException("加库存商品不存在");
        }
        iWebDeptProductService.update(new UpdateWrapper<WebDeptProduct>()
                .eq("id",webDeptProductCargoReply.getProductId())
                .set("stock",product.getStock() + cargoReplyData.getNumber())
        );

        //入库记录
        productLog = new WebDeptProductLog();
        productLog.setDeptId(product.getDeptId());
        productLog.setDeptName(sysDept.getDeptName());
        productLog.setProductId(product.getId());
        productLog.setProductName(product.getName());
        productLog.setNumber("-"+cargoReplyData.getNumber()+"");
        productLog.setComment("调货入库");
        iWebDeptProductLogService.save(productLog);
        return 1;
    }

    @Autowired
    private IWebDeptProductCargoService iWebDeptProductCargoService;
    @Autowired
    private IWebDeptProductService iWebDeptProductService;
    @Autowired
    private IWebDeptProductLogService iWebDeptProductLogService;
    @Autowired
    private ISysDeptService iSysDeptService;
}
